package pe.com.astech.web.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import pe.com.astech.web.bean.DetalleOrdenTrabajoBean;
import pe.com.astech.web.bean.EmpleadoBean;
import pe.com.astech.web.bean.MaquinariaBean;
import pe.com.astech.web.bean.UsuarioBean;
import pe.com.astech.web.service.MaquinariaService;
import pe.com.astech.web.service.OrdenTrabajoService;
import pe.com.astech.web.service.TipoModuloService;
import pe.com.astech.web.util.Constantes;



@Controller
@RequestMapping(value = "/maquinaria.html")
public class MaquinariaController {

	@Autowired
	OrdenTrabajoService ordenTrabajoService;
	@Autowired
	TipoModuloService tipoModuloService;
	@Autowired
	MaquinariaService maquinariaService;
	

	
	private static final Log log = LogFactory.getLog(MaquinariaController.class);
	
	@RequestMapping(method = RequestMethod.GET)
	public String showForm(ModelMap model) {
		String mensajeTrazabilidad = "metodo: showForm MaquinariaController";
		log.info(mensajeTrazabilidad);
				
		return Constantes.FORM_MAQUINARIA;
	}
	
	@RequestMapping(params={"accion=buscarMaquinaria","nombre","modelo","estado"})
	public String buscarMaquinaria(ModelMap model,HttpServletRequest request,@Valid MaquinariaBean maquinariaBean,
			BindingResult result) {
		
		String mensajeTrazabilidad = "metodo: buscarMaquinaria ";
		log.info(mensajeTrazabilidad + "  " + maquinariaBean.toString() );
		List<MaquinariaBean> list = new ArrayList<MaquinariaBean>();
		
		try {
			list = maquinariaService.buscarMaquinarias(mensajeTrazabilidad,maquinariaBean);
		} catch (RuntimeException e) {
			log.error(mensajeTrazabilidad + " Ocurrio un ERROR " + e.getMessage());
		}
		
		model.put("maquinariaListMaquinarias", list);
		
		return Constantes.FORM_MAQUINARIA;
	}
	
	
	
	@RequestMapping(params={"accion=guardarMaquinaria"},method = RequestMethod.POST)
	public String guardarMaquinaria(ModelMap model,HttpServletRequest request,@Valid MaquinariaBean maquinariaBean) {

		String mensajeTrazabilidad = "metodo: guardarMaquinaria ";
		String estado = Constantes.NOOK;
		List<MaquinariaBean> list = new ArrayList<MaquinariaBean>();
		
		log.info(mensajeTrazabilidad + "  " + maquinariaBean.toString() );
		try{
			EmpleadoBean empleado = (EmpleadoBean) request.getSession(false).getAttribute("sessionUsuario");
			log.info(mensajeTrazabilidad + "  " + empleado.toString() );
			maquinariaBean.setEmpleado_id_empleado(empleado.getId_empleado());
			estado = maquinariaService.guardarMaquinaria(mensajeTrazabilidad,maquinariaBean);
			list = maquinariaService.buscarMaquinarias(mensajeTrazabilidad,maquinariaBean);
		} catch(RuntimeException e){
			log.error(mensajeTrazabilidad + " Ocurrio un ERROR " + e.getMessage());
		}
		model.put("estado", estado);
		model.put("maquinariaListMaquinarias", list);
		
		return Constantes.FORM_MAQUINARIA;
	}

	
	
	@RequestMapping(params={"accion=evaluarMaquinaria","nombre","modelo","estado"})
	public String evaluarMaquinaria(ModelMap model,HttpServletRequest request,@Valid MaquinariaBean maquinariaBean,
			BindingResult result) {
		
		String mensajeTrazabilidad = "metodo: evaluarMaquinaria ";
		log.info(mensajeTrazabilidad + "  " + maquinariaBean.toString() );
		List<MaquinariaBean> list = new ArrayList<MaquinariaBean>();
		
		try {
			list = maquinariaService.buscarMaquinarias(mensajeTrazabilidad,maquinariaBean);
		} catch (RuntimeException e) {
			log.error(mensajeTrazabilidad + " Ocurrio un ERROR " + e.getMessage());
		}
		request.getSession(false).setAttribute("maquinariaListMaquinarias", list);
		model.put("maquinariaListMaquinarias", list);
		
		return Constantes.FORM_MAQUINARIA_EVALUAR;
	}
	
	@RequestMapping(params={"accion=buscarMaquinariaEvaluar","nombre","modelo","estado"})
	public String buscarMaquinariaEvaluar(ModelMap model,HttpServletRequest request,@Valid MaquinariaBean maquinariaBean,
			BindingResult result) {
		
		String mensajeTrazabilidad = "metodo: buscarMaquinariaEvaluar ";
		log.info(mensajeTrazabilidad + "  " + maquinariaBean.toString() );
		List<MaquinariaBean> list = new ArrayList<MaquinariaBean>();
		
		try {
			list = maquinariaService.buscarMaquinarias(mensajeTrazabilidad,maquinariaBean);
		} catch (RuntimeException e) {
			log.error(mensajeTrazabilidad + " Ocurrio un ERROR " + e.getMessage());
		}
		request.getSession(false).setAttribute("maquinariaListMaquinarias", list);
		model.put("maquinariaListMaquinarias", list);
		
		return Constantes.FORM_MAQUINARIA_EVALUAR;
	}
	
	@RequestMapping(params={"accion=descargarMaquinaria","id_maquinaria"}, method = RequestMethod.GET)
	public ResponseEntity<byte[]> descargarMaquinaria(ModelMap model,HttpServletRequest request,@Valid MaquinariaBean maquinariaBean,
			BindingResult result) {
		
		String mensajeTrazabilidad = "metodo: descargarMaquinaria ";
		log.info(mensajeTrazabilidad + " " + maquinariaBean.toString() );
		
		ResponseEntity<byte[]> response = null;
		
		try {
			List<MaquinariaBean> list = (List<MaquinariaBean>) request.getSession(false).getAttribute("maquinariaListMaquinarias");
			
			response = maquinariaService.descargarMaquinaria(mensajeTrazabilidad,maquinariaBean.getId_maquinaria(),list);
		} catch (RuntimeException e) {
			log.error(mensajeTrazabilidad + " Ocurrio un ERROR " + e.getMessage());
		}
				
		return response;
	}
	
	@RequestMapping(params={"accion=actualizarMaquinaria"})
	public String actualizarMaquinaria(ModelMap model,HttpServletRequest request,@Valid MaquinariaBean maquinariaBean,
			BindingResult result) {
		
		String mensajeTrazabilidad = "metodo: actualizarMaquinaria ";
		log.info(mensajeTrazabilidad + "  " + maquinariaBean.toString() );
		List<MaquinariaBean> list = new ArrayList<MaquinariaBean>();
		
		try {
			List<MaquinariaBean> listaMaquinaria = (List<MaquinariaBean>) request.getSession(false).getAttribute("maquinariaListMaquinarias");
			EmpleadoBean empleado = (EmpleadoBean) request.getSession(false).getAttribute("sessionUsuario");
			maquinariaBean.setEmpleado_id_supervisor(empleado.getId_empleado());
			String respuesta = maquinariaService.actualizarMaquinaria(mensajeTrazabilidad,maquinariaBean,listaMaquinaria);
			list = maquinariaService.buscarMaquinarias(mensajeTrazabilidad,maquinariaBean);
		} catch (RuntimeException e) {
			log.error(mensajeTrazabilidad + " Ocurrio un ERROR " + e.getMessage());
		}
		request.getSession(false).setAttribute("maquinariaListMaquinarias", list);
		model.put("maquinariaListMaquinarias", list);
		
		return Constantes.FORM_MAQUINARIA_EVALUAR;
	}
	
}
